home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asm_msc1.arc
/
EX44.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-20
|
2KB
|
48 lines
TITLE Division With Overflow (EX44.ASM)
PAGE ,132
OUR_CODE SEGMENT PARA 'CODE'
PUBLIC DIVUO
DIVUO PROC FAR
ASSUME CS:OUR_CODE
CMP BX,0 ;Divisor = 0?
JNZ DVROK
INT 0
DVROK: PUSH ES ;Save current ES register
PUSH DI ; and DI register
MOV DI,0 ;Fetch current INT 0 vector
MOV ES,DI
PUSH ES:[DI] ; and save it on the stack
PUSH ES:[DI+2]
MOV CX,OFFSET OVR_INT ;Make INT 0 vector
MOV ES:[DI],CX ; point to OVR_INT
MOV CX,SEG OVR_INT
MOV ES:[DI+2],CX
DIV BX ;Perform the division
SUB BX,BX ;If no overflow, BX = 0
RESTORE: POP ES:[DI+2] ;Restore INT 0 vector
POP ES:[DI]
SUB CX,CX ;Final rem = CX:DX
POP DI ;Restore original DI
POP ES ; and ES
RET
;
; This interrupt service routine is executed if the divide
; operation produces overflow.
;
OVR_INT: POP CX ;Modify ret. addr. offset
LEA CX,RESTORE
PUSH CX
PUSH AX
MOV AX,DX ;Set up 1st dividend, 0-Y1
SUB DX,DX
DIV BX ;Q1 is in AX, R1 is in DX
POP CX ;Pop orig. AX into CX
PUSH AX ;Save Q1 on stack
MOV AX,CX ;Set up 2nd dividend, R1-Y0
DIV BX ;Q0 is in AX, R0 is in DX
POP BX ;Final quotient is in BX:AX
IRET
DIVUO ENDP
OUR_CODE ENDS
END DIVUO